• Source control

    GitHub

    Checks, deployments and a comment on every pull request.

    Cloud · Enterprise Server 3.10+

  • GitLab

    Merge request pipelines, environments and merge trains.

    Cloud · self-managed 16+

  • Bitbucket

    Pull request builds and a status on each commit.

    Cloud Beta

  • Built from

    Docker Compose

    The file you run locally, profiles and overrides included.

    Compose v2

  • Helm

    Your chart, with a values file layered on for each branch.

    Helm 3 · OCI charts

  • Dockerfile

    A single service with nothing else to describe.

    BuildKit

  • Data

    Postgres

    Restored from a nightly snapshot, masked before it leaves the bucket.

    13 to 17

  • MySQL

    The same snapshot, mask and restore, with binlog off.

    8.0 and 8.4

  • Redis

    Started empty, or seeded from an RDB file in the repo.

    6 and 7

  • Runs in

    AWS

    A runner on EKS or plain EC2, in the account and region you choose.

    us-east-1 · us-east-2 · us-west-2

  • Google Cloud

    A runner on GKE, with previews as namespaces.

    us-central1 · us-east4 · us-west1

  • Secrets

    AWS Secrets Manager

    Read at build time with a role the runner assumes.

    Scoped by prefix

  • Vault

    Short-lived tokens for each preview, revoked at teardown.

    KV v2

  • Tells your team

    Slack

    One message for each pull request, updated as the preview changes.

    Threads per pull request

  • Webhooks

    Six signed events, for everything this list does not name.

    HMAC-SHA256

Something missing? Most of this list started as a customer asking. Tell us what you run

Anything else, by webhook.

Every change in a preview's life is an event you can subscribe to. Post the link to a ticket, start an end-to-end run, or page nobody at all.

Six events
preview.building, preview.ready, preview.asleep, preview.awake, preview.failed and preview.torn_down.
Signed and retried
Every delivery carries an HMAC signature and is retried with backoff for 24 hours.
Or ask instead
The REST API and the CLI return the same objects, so a script can poll for what a webhook would push.
preview.ready.json POST
  1. {
  2. "event": "preview.ready",
  3. "pull_request": 482,
  4. "branch": "feat/multi-currency",
  5. "commit": "9f3e1b0",
  6. "url": "https://pr-482.northwind.canary.run",
  7. "services": ["web", "api", "worker"],
  8. "ready_in_seconds": 221,
  9. "sleeps_after": "30m",
  10. "teardown": "on_merge"
  11. }

Point it at a repository you already have.

Canary reads your Compose file or chart and builds the first preview while you watch the log. The first 500 preview-hours are free.

Two engineers reviewing a preview on a laptop
pr-482 torn down Merged into main · 14:05